package main

import (
	"fmt"
	"net"
	"strings"
)

func mainscd() {
	// 创建监听
	ip := "127.0.0.1"
	port := 8848
	address := fmt.Sprintf("%s:%d", ip, port)

	listenner, err := net.Listen("tcp", address)
	// net.Listen("tcp", ":8848") 默认本机
	if err != nil {
		fmt.Println("net.Listen err:", err)
		return
	}

	// 需求：server可以接收多个连接， ===> 主go程负责监听，子go程负责数据处理
	// 每个连接可以接收处理多轮数据请求
	for {
		fmt.Println("监听中......")
		// Accept() (net.Conn, error)，，，建立连接
		conn, err := listenner.Accept()
		if err != nil {
			fmt.Println("listenner.Accept err:", err)
			return
		}

		fmt.Println("连接建立成功!")
		go handle(conn)

	}
}

// 处理具体业务的逻辑，需要将conn传递进来，每一次连接，conn是不同的
func handle(conn net.Conn) {
	for {
		// 创建一个容器，用于接收读取到的数据
		buf := make([]byte, 1024) // 使用make创建字节切片，byte ==> uint8
		// Read(b []byte) (n int, err error)
		// cnt:真正读取client发来的数据长度
		fmt.Println("准备读取客户端发送过来的数据")
		cnt, err := conn.Read(buf) // 读不到数据会阻塞在此处
		if err != nil {
			fmt.Println("conn.Read err:", err)
			return
		}

		fmt.Println("Client =====> Server, 长度:", cnt, ", 数据: ", string(buf[:cnt]))

		// 服务器对客户端请求进行响应
		// 将数据转为大写“hello” ====> HELLO
		upperDate := strings.ToUpper(string(buf[:cnt]))

		// Write(b []byte) (n int, err error)
		cnt, err = conn.Write([]byte(upperDate))
		if err != nil {
			fmt.Println("conn.Write err:", err)
			return
		}
		fmt.Println("Client <======= Server, 长度: ", cnt, ", 数据: ", upperDate)
	}
	// 关闭连接
	// conn.Close()
}
